package com.nys.conci.base.convertidor;


import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import java.text.DecimalFormat;
import java.text.ParsePosition;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

/**
 *
 * @author Adam M. Gamboa Gonzalez
 */
@FacesConverter(value="NumeroConverter")
public class NumeroConverter implements Converter{
    @Override
    public final Object getAsObject(FacesContext context, UIComponent component, String value)
            throws ConverterException {
        if (context == null || component == null) {
            throw new NullPointerException();
        }
        if (value == null || value.trim().equalsIgnoreCase("")) {
            return null;
        }
        String maximoDig = (String) component.getAttributes().get("maximoDigitos");
        String patron = (String) component.getAttributes().get("patron");
        if(patron == null){
           patron = "#,##0.00";
        }

        ParsePosition parsePosition = new ParsePosition(0);
        Number n = new DecimalFormat(patron).parse(value, parsePosition);
        
        if(maximoDig != null && n != null){
            Integer maxDig = Integer.parseInt(maximoDig);
            double base = 10;
            Double valor_maximo = Math.pow(base, maxDig.doubleValue());
            if(valor_maximo <= n.doubleValue()){
               String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.numero.maximodigitos", maxDig);
               String id_componente= component.getId();
               MensajeUtil.agregarMensajeErrorComponente(id_componente, mensaje);
               throw new ConverterException(mensaje);
            }
        }

        if (n == null || parsePosition.getIndex() != value.length()) {
            throw new ConverterException(EtiquetasUtil.obtenerMensaje("javax.faces.converter.DoubleConverter.DOUBLE"));
        }
        return n instanceof Double ? n : new Double(n.doubleValue());
    }

    @Override
    public final String getAsString(FacesContext context, UIComponent component, Object value)
            throws ConverterException {
        if (context == null || component == null) {
            throw new NullPointerException();
        }
        if (value == null) {
            return null;
        }
        if (value instanceof String) {
            return (String) value;
        }

        String patron = (String) component.getAttributes().get("patron");
        if(patron == null){
            patron = "#,##0.00";
        }
        
        try {
            return new DecimalFormat(patron).format(((Number) value).doubleValue());
        } catch (Exception e) {
            throw new ConverterException(EtiquetasUtil.obtenerEtiqueta("javax.faces.converter.DoubleConverter.DOUBLE"));
        }
    }
}
